Laravel 4.2とLaravel 5.7のキューの取扱の違い
ジョブハンドラー(ワーカー)の実装
SendEmailジョブハンドラーはfire($job, $data)を実装する
キューイング
Queueファサードを使ってQueue::push('SendEmail', ['message' => $message]);
キューイングの第二引数はJob側(SendEmail)のhandle(Job $job,array $data)の第二引数で取得できる
code:php
// キューをつむ
// キューをハンドルするのは単にfire()を書けばよいだけ
class SendEmail {
public function fire(Illuminate\Queue\Jobs\Job $job, array $data) {
try {
// something to do.
} catch (\Exception e) {
$job->delete() // もしジョブを手動で削除したいならこうする
}
}
}
キューワーカーの起動
ジョブハンドラーの実装
php artisan make:job JOB_NAMEジョブのクラスを作成できる
Illuminate\Contracts\Queue\ShouldQueueインタフェースを実装する
実装するのはコンストラクタとhandle()のみ
キューイング
JOB_NAME::dispatch($argWillSendToJobConstructor)
dispatchの引数はジョブ側のコンストラクタに渡される
4.2での$dataの受け渡しはできなくなったので、代わりにこれで行うようにする
code:php
// キューを積む
SendEmail::dispatch($message)
// キューをハンドルするには Illuminate\Contracts\Queue\ShouldQueue を実装する必要がある
// ただしShouldQueueは空である
// たんにキューに入れたいだけなのであれば、ShouldQueueインタフェースを実装するだけでよく、トレイトはいらない
class SendEmail implements ShouldQueue {
// artisan make:jobで作成するとこれらのtraitがつく
// おそらく、便利なのでデフォルトで付いているだけ
// 例えば、Eloquentを使わないならSerialaizesModelsは不要なはず
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
private $message;
public function __construct($message) { // dispatch()の引数が渡る
$this->message = $message;
}
public function handle() { // handleに外から引数は直接渡せないが、サービスコンテナからDIされる
try {
// something to do.
} catch (\Exception e) {
// ジョブを直接削除するdelete()は、Illuminate\Queue\InteractsWithQueueに定義されている
$this->delete()
}
}
}
キューワーカーの起動
php artisan queue:work
キューワーカーの再起動
php artisan queue:restartをすると、ジョブの処理が終了した跡、キューワーカにdieさせるようにする(graceful shutdown的な挙動)